#!/bin/bash
set -eux
 
# 默认环境变量
export RUNTIME_JAVA_OPTIONS=${RUNTIME_JAVA_OPTIONS-}
 
# 全局变量
# TODO: 按实际项目进行修改
declare -a appArr=(rpc-service gateway)
 
#######################################
# 验证应用
# 参数：
#   app: 应用名称
#######################################
validateApp(){
  local app="$1"
 
  for v in "${appArr[@]}"
  do
    if [[ "${v}" == "${app}" ]]; then
      return 0
    fi
  done
 
  error "app=${app} is invalid, appArr=(${appArr[*]})."
  return 1
}
 
#######################################
# 启动应用
# 参数：
#   app: 应用名称
#######################################
start(){
  local app="$1"
  cd "$app"
  eval "java -Dspring.config.location='./config.properties' ${RUNTIME_JAVA_OPTIONS} -jar ./app.jar"
}
 
#######################################
# 终止应用
# 参数：
#   app: 应用名称
#######################################
stop(){
  # 由于，目前 java spring 框架支持平滑终止，因此，此函数不必做任何修改。
  echo 'app handles itself'
}
 
#######################################
# 健康检查应用
# 参数：
#   app: 应用名称
#######################################
healthcheck(){
  local app="$1"
 
  case "${app}" in
    rpc-service) # TODO: 按实际项目进行修改
      curl -f http://localhost/actuator/health
    ;;
    gateway) # TODO: 按实际项目进行修改
      curl -f http://localhost/actuator/health
    ;;
  esac
}
 
#######################################
# 输出错误
# 参数：
#   错误信息（支持多个）
#######################################
error(){
  echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" >&2
}
 
#######################################
# 主函数
# 参数：
#   opcode: 操作码（start、stop、healthcheck）
#   app: 应用名称
#######################################
main(){
  local opcode="$1"
  local app="$2"
 
  validateApp "$app"
 
  case "$opcode" in
    start)
      start "$app"
      ;;
    stop)
      stop "$app"
      ;;
    healthcheck)
      healthcheck "$app"
      ;;
    *)
      error "opcode=${opcode} is invalid."
      exit 1
      ;;
  esac
}
 
# 打印工作目录树
tree
 
main "$@"